package com.shujia.spark.opt

import org.apache.spark.rdd.RDD
import org.apache.spark.{SparkConf, SparkContext}

object Demo3RePartition {
  def main(args: Array[String]): Unit = {
    //1、创建spark的执行环境
    val conf = new SparkConf()
    //设置运行模式
    conf.setMaster("local")
    conf.setAppName("wc")
    val sc = new SparkContext(conf)

    //可以在读取数据时指定最小分区数设定RDD的分区数,需要保证每一个分区被等分
    val studentsRDD: RDD[String] = sc.textFile("data/test3", 3)
    println(s"studentsRDD分区数:${studentsRDD.getNumPartitions}")

    //读取数据时,如果有很多小文件,可以合并小文件
    val mergeRDD: RDD[String] = studentsRDD.coalesce(2, shuffle = false)
    println(s"mergeRDD分区数:${mergeRDD.getNumPartitions}")
    mergeRDD.foreach(println)


//    //repartition: 重分区,会产生shuffle
//    val rePartitionRDD: RDD[String] = studentsRDD.repartition(100)
//    println(s"rePartitionRDD分区数:${rePartitionRDD.getNumPartitions}")
//    rePartitionRDD.saveAsTextFile("data/test3")
//
//    //coalesce(1, shuffle = false): 合并分区,不会产生shuffle
//    //一班用于最后合并小文件
//    val coalesceRDD: RDD[String] = rePartitionRDD.coalesce(1, shuffle = false)
//    println(s"coalesceRDD分区数:${rePartitionRDD.getNumPartitions}")
//
//    coalesceRDD.saveAsTextFile("data/test4")

  }
}
